package com.xzd.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.Converter;

/**
 *Web开发中一个很频繁的操作就是从Request中取得客户端传递过来的参数信息，然后Servlet
 *（或是struts的Action，SpringMVC的Controller）接收这些参数，调用Service层完成业务逻辑操作
 *，为了避免出现太多的Request.getParameter()，我们可以模仿struts的FormBean自己写一个收集参数的工具类，
 *不求有多强大，但求实用。下面贴出的这段代码，FormBean中的属性支持基本类型和基本类型的数组，没有做自定义类型，
 *不是不能做，而是我觉得WEB层更面向数据一些反而更好操作（Service层倒是可以更面向对象一些）
 *
 */
public class WebUtil {
	
	public static SimpleDateFormat getFormat(String pattern){
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat();
		simpleDateFormat.applyPattern(pattern);
		return simpleDateFormat;
		
	}
	public static <T> T requestParam2Bean(HttpServletRequest request,Class<T>  beanClass){
		try{
			T bean = beanClass.newInstance();
			
			Map map = request.getParameterMap();
			
			ConvertUtils.register(new Converter(){

				public Object convert(Class type, Object value) {
					if(value==null){
						return null;
					}
					String str = ((String) value).trim();
					if(str.trim().equals("")){
						return null;
					}
					Date d = null;
					SimpleDateFormat format = null;
					
					if(str.length()>10){
						if(str.indexOf("-")>0){
							format = getFormat("yyyy-MM-dd HH:mm:ss");
						} else {
							format = getFormat("yyyy/MM/dd HH:mm:ss");
						}
					} else {
						if(str.indexOf("-")>0){
							format = getFormat("yyyy-MM-dd");
						} else {
							format = getFormat("yyyy/MM/dd");
						}
					}
					try {
						d = format.parse(str);
					} catch (ParseException e) {
						throw new RuntimeException(e);
					}
					return d;
				}
			}, Date.class);
			BeanUtils.populate(bean, map);   
			return bean;
		}catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
}